package com.itheima;

import com.example.EnableHeaderConfig;
import com.example.HeaderConfig;
import com.example.MyImportSelector;
import com.example.TokenParser;
import org.dom4j.io.SAXReader;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;

/**
 * 1. 如何从IOC容器中手动的获取到bean对象
 * 2. bean的作用域配置
 * 3. 管理第三方的bean对象
 *
 * @Import导入
 * - 导入形式主要有以下几种：
 *   1. 导入普通类
 *   2. 导入配置类
 *   3. 导入ImportSelector接口实现类
 *当要引入一个第三方依赖时，还要知道第三方依赖中有哪些配置类和哪些Bean对象。不友好，而且比较繁琐
 * 我们不用自己指定要导入哪些bean对象和配置类了，让第三方依赖它自己来指定
 * 比较常见的方案就是第三方依赖给我们提供一个注解，这个注解一般都以@EnableXxxx开头的注解，注解中封装的就是@Import注解
 *
 */


//@ComponentScan({"com.itheima","com.example"}) //指定要扫描的包,并且原来默认扫描的包会被覆盖，所以要加上come.itheima。缺点：1. 使用繁琐，2. 性能低

//@Import({TokenParser.class}) //导入普通类，交给ioc容器管理
//@Import({HeaderConfig.class})  //导入配置类，交给ioc容器管理
//@Import({MyImportSelector.class})   //导入的是 ImportSelector接口的实现类

@EnableHeaderConfig   //使用第三方依赖提供的Enable开头的注解
@SpringBootApplication    //只能扫描到come.itheima下的子包，扫不到第三方提供的依赖
public class SpringbootWebConfig2Application {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootWebConfig2Application.class, args);
    }

    /*
    //如果要管理的bean对象来自于第三方（不是自定义的），是无法用@Component 及衍生注解声明bean的，就需要用到@Bean注解。
    //声明第三方bean
    @Bean //将当前方法的返回值对象交给IOC容器管理, 成为IOC容器bean
    public SAXReader saxReader(){
        return new SAXReader();
    }
        //说明：以上在启动类中声明第三方Bean的作法，不建议使用（项目中要保证启动类的纯粹性）
        //如果需要定义第三方Bean时， 通常会单独定义一个配置类
*/
}

